const { sampleText } = require("./data/sampleText");
const { Client } = require("./Client");
const { TextOperation } = require("./ot/TextOperation");

// 先来模拟撤销操作
const base = sampleText; // 基础文本
const op = new TextOperation(); // 创建一个操作对象
op.retain(5).delete(5).insert("Universe"); // 执行一系列的操作
const newText = op.apply(base);
console.log("更新后的文斌内容：", newText); // 输出操作后的文本
// 接下来进行撤销的测试
const inversedOp = op.invert(base); // 反转操作对象
const restoedText = inversedOp.apply(newText); // 应用反转操作对象
console.log("撤销后的文本内容：", restoedText); // 输出撤销后的文本

console.log("===============================");

// 下面测试协同编辑的操作
const A = new Client("A"); // 创建客户端 A
const B = new Client("B"); // 创建客户端 B

A.doc = B.doc = sampleText; // 初始化客户端的文档内容

// 接下来首先是客户端 A 进行本地操作
const opA = new TextOperation().retain(10).insert("X"); // 在原本的文本后面插入一个 X
A.applyLocal(opA); // 客户端A执行本地操作
B.receiveRemote({ version: 0, op: opA }); // 客户端B接收远程操作

console.log("===============================");
// 接下来是客户端 B 进行本地操作
const opB = new TextOperation().retain(10).insert("Y"); // 在原本的文本后面插入一个 Y
B.applyLocal(opB); // 客户端B执行本地操作
A.receiveRemote({ version: 1, op: opB }); // 客户端A接收远程操作
